package behaviorModel.command;

/**
 * 命令模式
 */
public class Client {
    /**
     * 优点
     1. 降低了系统耦合度
     2. 新的命令可以很容易添加到系统中去。
     缺点
     使用命令模式可能会导致某些系统有过多的具体命令类。

     五、模式使用场景
     1.系统需要将请求调用者和请求接收者解耦，使得调用者和接收者不直接交互。
     2.系统需要在不同的时间指定请求、将请求排队和执行请求。
     3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
     5.系统需要将一组操作组合在一起，即支持宏命令。

     六、模式扩展
     1. 撤销命令
     在电视遥控器中，我们还有这样一个按钮，那就是返回。用于切换到上面一个频道中去。在命令模式中也支持撤销操作，在这里我们只需要记录上一个频道，然后将上一个频道传入即可。
     在这里将Command进行一个简单的修改：将execute()改为execute(int I );i表示频道，用于进行频道切换。
     七、总结
     1. 命令模式的本质就是将命令对象进行封装打包，将发出命令的责任和执行命令的责任进行割开。
     2. 命令模式中发送者只需要知道如何发送请求命令，无须关心命令执行具体过程。
     3. 在发送者和接收者两者间是通过命令对象进行沟通的。请求命令本身就当做一个对象在两者间进行传递，它封装了接收者和一组动作。
     4. 命令模式支持撤销。
     5. 命令模式队列请求和日志请求。
     * @param a
     */
        public static void main(String a[])
        {
            Command openCommand,closeCommand,changeCommand;

            openCommand = new OpenTvCommand();
            closeCommand = new CloseTvCommand();
            changeCommand = new ChangeChannelCommand();

            Controller control = new Controller(openCommand,closeCommand,changeCommand);

            control.open();           //打开电视机
            control.change();         //换频道
            control.change();
            control.ChannelUndo();
            control.ChannelUndo();
            control.ChannelUndo();
            control.close();          //关闭电视机
        }

}